
package util.www.sql.domain;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import util.file.xml.CampoXml;
import util.file.xml.RegistroXml;


/**
 *
 * @author Rdelacruz
 */
public class TablaSql {
            
    private String nombre;
    
    private Map<String,ColumnaSql> columnas;
    
    private List<ColumnaSql> columnasClave;
    String[] nombreColumnasClave;
    
    public TablaSql() {
        columnas = new HashMap<String,ColumnaSql>();
        columnasClave = new ArrayList<ColumnaSql>();
    }
    
    public String scriptInsert(List<RegistroXml> registros) throws Exception {
        StringBuilder sb = new StringBuilder();
        for(RegistroXml r: registros) {
            sb.append(this.scriptInsert(r));
        }
        return sb.toString();
    }
    
    public String scriptInsert(RegistroXml reg) throws Exception {
        StringBuilder sb = new StringBuilder();
        sb.append("INSERT INTO ");
        sb.append(this.nombre+"(");
        
        List<ValorSql> lista = new ArrayList<ValorSql>();
        for (Map.Entry<String, CampoXml> e : reg.getValores()) {
            //System.out.println(entry.getKey() + "/" + entry.getValue());
            String colXml = e.getKey();
            ColumnaSql colSql = this.getColumna(colXml);
            if(colSql!=null) {
                ValorSql v = new ValorSql();
                v.setColumna(colSql);
                v.setValor(e.getValue().getValor());
                lista.add(v);
                
                sb.append(colXml);
                sb.append(",");
            }
            else {                
                throw new Exception("Tabla '"+this.nombre+"': NO EXISTE COLUMNA '"+colXml+"' (INSERT)");
                //Logger.getLogger().loge(tsql.getNombre()+" INSERT: NO EXISTE COLUMNA '"+colXml+"'");                
            }
        }
        int n = sb.length();        
        sb.delete(n-1, n);//borrando la coma
        
        sb.append(") VALUES (");
        for (ValorSql v: lista) {            
            sb.append(v.getValorSql());
            sb.append(",");
        }
        
        n = sb.length();
        sb.delete(n-1, n);//borrando la coma
        sb.append("); ");
        
        return sb.toString();
    }
    
    public String scriptUpdate(RegistroXml reg, String condicionWhere) throws Exception {
        StringBuilder sb = new StringBuilder();
        sb.append("UPDATE "+this.nombre);
        sb.append(" SET ");
        for (Map.Entry<String, CampoXml> e : reg.getValores()) {   
            //System.out.println(entry.getKey() + "/" + entry.getValue());
            String colXml = e.getKey();
            ColumnaSql colSql = this.getColumna(colXml);            
            if(colSql!=null) {            
                sb.append(colXml+"="); 
                ValorSql v = new ValorSql();
                v.setColumna(colSql);
                v.setValor(e.getValue().getValor());
                sb.append(v.getValorSql());
                sb.append(",");
            }
            else {
                throw new Exception("Tabla '"+this.nombre+"': NO EXISTE COLUMNA '"+colXml+"' de archivo XML en tabla SQL (UPDATE)");
                //Logger.getLogger().loge(tsql.getNombre()+" UPDATE: NO EXISTE COLUMNA '"+colXml+"'");                
            }
        }
        int n = sb.length();        
        sb.delete(n-1, n);//borrando la coma  
        
        sb.append(" "+condicionWhere+"; ");
        
        return sb.toString();
    }
    
    //public List<ColumnaSql> getColumnasClave() {
    //    return columnasClave;
    //}
    
    public String[] getNombreColumnasClave() {
        return nombreColumnasClave;
    }

    @Override
    public String toString() {
        return "TablaSql{" + "nombre=" + nombre + ", columnas=" + columnas + '}';
    }
    
    public void postProcesar() {
        nombreColumnasClave = new String[columnasClave.size()];
        int i=0;
        for(ColumnaSql c : columnasClave) {
            nombreColumnasClave[i++] = c.getNombre();
        }
    }

    public void setNombre(String nombre) {
        this.nombre = nombre.trim();        
    }

    public String getNombre() {
        return nombre;
    }

    public void addColumna(ColumnaSql c) {
        columnas.put(c.getNombre().toUpperCase(), c);
    }
    
    public ColumnaSql getColumna(String columna) {
        return columnas.get(columna.toUpperCase());
    }
    
    public void addColumnaClave(String nombreColumnaPk) {
        columnasClave.add(this.getColumna(nombreColumnaPk));
    }

   

    

    
    
    
}
